home *** CD-ROM | disk | FTP | other *** search
/ Dr. Windows 3 / dr win3.zip / dr win3 / PROGRAMR / OLE2BOOK.ZIP / CHAP11.ZIP / CHAP11 / POLYLINE / POLYLINE.H < prev    next >
C/C++ Source or Header  |  1993-06-17  |  14KB  |  397 lines

  1. /*
  2.  * POLYLINE.H
  3.  * Polyline Component Object Chapter 11
  4.  *
  5.  * Definitions and function prototypes for the PolyLine DLL object.
  6.  *
  7.  * Copyright (c)1993 Microsoft Corporation, All Rights Reserved
  8.  *
  9.  * Kraig Brockschmidt, Software Design Engineer
  10.  * Microsoft Systems Developer Relations
  11.  *
  12.  * Internet  :  kraigb@microsoft.com
  13.  * Compuserve:  >INTERNET:kraigb@microsoft.com
  14.  */
  15.  
  16.  
  17. #ifndef _POLYLINE_H_
  18. #define _POLYLINE_H_
  19.  
  20. #include <windows.h>
  21. #include <ole2.h>
  22. #include <classlib.h>
  23. #include <bookguid.h>
  24. #include <ipoly6.h>
  25. #include "resource.h"
  26.  
  27. //CHAPTER11MOD
  28. #include <ole2ui.h>
  29. //End CHAPTER11MOD
  30.  
  31.  
  32. //Classname
  33. #define SZCLASSPOLYLINE             "polyline"
  34.  
  35. //CHAPTER11MOD
  36. #define SZPOLYFRAMETITLE            "Polyline Figure in %s"
  37.  
  38. //Some magic number to add to aspects for returns from IViewObject::Freeze
  39. #define FREEZE_KEY_OFFSET           0x0723
  40. //End CHAPTER11MOD
  41.  
  42.  
  43. #define HIMETRIC_PER_INCH           2540
  44.  
  45. //Window extra bytes and offsets
  46. #define CBPOLYLINEWNDEXTRA          (sizeof(LONG))
  47. #define PLWL_STRUCTURE              0
  48.  
  49.  
  50.  
  51. //DLLPOLY.CPP
  52. //This class factory object creates Polyline objects.
  53.  
  54. class __far CPolylineClassFactory : public IClassFactory
  55.     {
  56.     protected:
  57.         ULONG           m_cRef;         //Reference count on object
  58.  
  59.     public:
  60.         CPolylineClassFactory(void);
  61.         ~CPolylineClassFactory(void);
  62.  
  63.         //IUnknown members
  64.         STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
  65.         STDMETHODIMP_(ULONG) AddRef(void);
  66.         STDMETHODIMP_(ULONG) Release(void);
  67.  
  68.         //IClassFactory members
  69.         STDMETHODIMP         CreateInstance(LPUNKNOWN, REFIID, LPVOID FAR *);
  70.         STDMETHODIMP         LockServer(BOOL);
  71.     };
  72.  
  73. typedef CPolylineClassFactory FAR * LPCPolylineClassFactory;
  74.  
  75.  
  76.  
  77. //POLYWIN.CPP
  78. LRESULT __export FAR PASCAL PolylineWndProc(HWND, UINT, WPARAM, LPARAM);
  79.  
  80. //CHAPTER11MOD
  81. #define PROP_SELECTOR   "Selector"
  82. #define PROP_OFFSET     "Offset"
  83.  
  84. BOOL __export FAR PASCAL PolyDlgProc(HWND, UINT, WPARAM, LPARAM);
  85. //End CHAPTER11MOD
  86.  
  87. //Type for an object-destroyed callback
  88. typedef void (FAR PASCAL *LPFNDESTROYED)(void);
  89.  
  90.  
  91. //POLYLINE.CPP
  92. class __far CPolyline : public IUnknown
  93.     {
  94.     friend LRESULT __export FAR PASCAL PolylineWndProc(HWND, UINT, WPARAM, LPARAM);
  95.  
  96.     //Make any contained interfaces your friends so they can get at privates
  97.     friend class CImpIPolyline;
  98.     friend class CImpIPersistStorage;
  99.     friend class CImpIDataObject;
  100.  
  101.     //CHAPTER11MOD
  102.     friend BOOL __export FAR PASCAL PolyDlgProc(HWND, UINT, WPARAM, LPARAM);
  103.     friend class CImpIOleObject;
  104.     friend class CImpIViewObject;
  105.     //End CHAPTER11MOD
  106.  
  107.     protected:
  108.         HWND            m_hWnd;
  109.         HINSTANCE       m_hInst;
  110.  
  111.         ULONG           m_cRef;         //Object reference count.
  112.         LPUNKNOWN       m_punkOuter;    //Controlling Unknown for aggregation
  113.         LPFNDESTROYED   m_pfnDestroy;   //Function to call on closure.
  114.         BOOL            m_fDirty;       //Have we changed?
  115.         POLYLINEDATA    m_pl;           //Our actual data.
  116.  
  117.         LPCStringTable  m_pST;          //Object strings
  118.         UINT            m_cf;           //Object clipboard format.
  119.         CLSID           m_clsID;        //Current CLSID
  120.         IID             m_iID;          //Custom interface IID.
  121.  
  122.         //Contained interfaces
  123.         LPPOLYLINE          m_pIPolyline;           //Implemented
  124.         LPPERSISTSTORAGE    m_pIPersistStorage;     //Implemented
  125.  
  126.         LPDATAOBJECT        m_pIDataObject;         //Implemented
  127.         LPDATAADVISEHOLDER  m_pIDataAdviseHolder;   //Used
  128.  
  129.         //CHAPTER11MOD
  130.         //IDataObject::EnumFormatEtc implemented by OLE for us now.
  131.         //End CHAPTER11MOD
  132.  
  133.         LPPOLYLINEADVISESINK    m_pAdv;
  134.  
  135.         //CHAPTER11MOD
  136.         //These are default handler interfaces we use
  137.         LPUNKNOWN           m_pDefIUnknown;
  138.         LPOLEOBJECT         m_pDefIOleObject;
  139.         LPVIEWOBJECT        m_pDefIViewObject;
  140.         LPPERSISTSTORAGE    m_pDefIPersistStorage;
  141.         LPDATAOBJECT        m_pDefIDataObject;
  142.  
  143.         //Implemented and used interfaces
  144.         LPOLEOBJECT         m_pIOleObject;          //Implemented
  145.         LPOLEADVISEHOLDER   m_pIOleAdviseHolder;    //Used
  146.  
  147.         LPOLECLIENTSITE     m_pIOleClientSite;      //Used
  148.  
  149.         LPVIEWOBJECT        m_pIViewObject;         //Implemented
  150.         LPADVISESINK        m_pIAdviseSink;         //Used
  151.         DWORD               m_dwFrozenAspects;      //From IViewObject::Freeze
  152.         DWORD               m_dwAdviseAspects;      //From IViewObject::SetAdvise
  153.         DWORD               m_dwAdviseFlags;        //From IViewObject::SetAdvise
  154.  
  155.         POLYLINEDATA        m_plContent;            //For freezing
  156.         POLYLINEDATA        m_plThumbnail;          //For freezing
  157.  
  158.         HWND                m_hDlg;                 //Editing window
  159.         //End CHAPTER11MOD
  160.  
  161.  
  162.  
  163.     protected:
  164.         void      PointScale(LPRECT, LPPOINT, BOOL);
  165.         //CHAPTER11MOD
  166.         void      Draw(HDC, BOOL, BOOL, LPRECT, LPPOLYLINEDATA);
  167.         void      SendAdvise(UINT);
  168.         //End CHAPTER11MOD
  169.         void      RectConvertMappings(LPRECT, BOOL);
  170.  
  171.         /*
  172.          * These members pulled from IPolyline now serve as a central
  173.          * store for this functionality to be used from other interfaces
  174.          * like IPersistStorage and IDataObject.  Other interfaces later
  175.          * may also use them.
  176.          */
  177.         STDMETHODIMP DataSet(LPPOLYLINEDATA, BOOL, BOOL);
  178.         STDMETHODIMP DataGet(LPPOLYLINEDATA);
  179.         STDMETHODIMP DataSetMem(HGLOBAL, BOOL, BOOL, BOOL);
  180.  
  181.         STDMETHODIMP RenderNative(HGLOBAL FAR *);
  182.         STDMETHODIMP RenderBitmap(HBITMAP FAR *);
  183.         STDMETHODIMP RenderMetafilePict(HGLOBAL FAR *);
  184.  
  185.     public:
  186.         CPolyline(LPUNKNOWN, LPFNDESTROYED, HINSTANCE);
  187.         ~CPolyline(void);
  188.  
  189.         BOOL      FInit(void);
  190.  
  191.         //Non-delegating object IUnknown
  192.         STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
  193.         STDMETHODIMP_(ULONG) AddRef(void);
  194.         STDMETHODIMP_(ULONG) Release(void);
  195.     };
  196.  
  197. typedef CPolyline FAR * LPCPolyline;
  198.  
  199.  
  200. //CHAPTER11MOD
  201. //Codes for CPolyline::SendAdvise
  202. //......Code........................... Method called in CPolyline::SendAdvise
  203. #define OBJECTCODE_SAVED          0     //IOleAdviseHolder::SendOnSave
  204. #define OBJECTCODE_CLOSED         1     //IOleAdviseHolder::SendOnClose
  205. #define OBJECTCODE_RENAMED        2     //IOleAdviseHolder::SendOnRename
  206. #define OBJECTCODE_SAVEOBJECT     3     //IOleClientSite::SaveObject
  207. #define OBJECTCODE_DATACHANGED    4     //IDataAdviseHolder::SendOnDataChange
  208. #define OBJECTCODE_SHOWWINDOW     5     //IOleClientSite::OnShowWindow(TRUE)
  209. #define OBJECTCODE_HIDEWINDOW     6     //IOleClientSite::OnShowWindow(FALSE)
  210. #define OBJECTCODE_SHOWOBJECT     7     //IOleClientSite::ShowObject
  211. //End CHAPTER11MOD
  212.  
  213.  
  214.  
  215. //Interface implementation contained in the Polyline.
  216.  
  217. //IPOLYLIN.CPP
  218. class __far CImpIPolyline : public IPolyline6
  219.     {
  220.     protected:
  221.         ULONG               m_cRef;      //Interface reference count.
  222.         LPCPolyline         m_pObj;      //Back pointer to the object.
  223.         LPUNKNOWN           m_punkOuter; //Controlling unknown for delegation.
  224.  
  225.     public:
  226.         CImpIPolyline(LPCPolyline, LPUNKNOWN);
  227.         ~CImpIPolyline(void);
  228.  
  229.         //IUnknown members.
  230.         STDMETHODIMP QueryInterface(REFIID, LPVOID FAR *);
  231.         STDMETHODIMP_(ULONG) AddRef(void);
  232.         STDMETHODIMP_(ULONG) Release(void);
  233.  
  234.         //::Data* and ::Render* replaced with IDataObject
  235.  
  236.         //Manipulation members:
  237.         STDMETHODIMP Init(HWND, LPRECT, DWORD, UINT);
  238.         STDMETHODIMP New(void);
  239.         STDMETHODIMP Undo(void);
  240.         STDMETHODIMP Window(HWND FAR *);
  241.  
  242.         STDMETHODIMP SetAdvise(LPPOLYLINEADVISESINK);
  243.         STDMETHODIMP GetAdvise(LPPOLYLINEADVISESINK FAR *);
  244.  
  245.         STDMETHODIMP RectGet(LPRECT);
  246.         STDMETHODIMP SizeGet(LPRECT);
  247.         STDMETHODIMP RectSet(LPRECT, BOOL);
  248.